package jp.co.menox.tmserver.dao;

import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.SortDirection;

import jp.co.menox.tmcommon.meta.BorrowingMeta;
import jp.co.menox.tmcommon.model.Borrowing;

/**
 * 借りたいものテーブル用dao
 * @author
 *
 */
public class BorrowingDao extends TmServerDaoBase<Borrowing>{

    private String nameOfCategoryId;
    private String nameOfUserId;
    private String nameOfWasDeleted;
    private String nameOfCreated;

    {
        BorrowingMeta meta = BorrowingMeta.get();
        nameOfCategoryId = meta.categoryId.getName();
        nameOfUserId = meta.userId.getName();
        nameOfWasDeleted = meta.wasDeleted.getName();
        nameOfCreated = meta.created.getName();
    }


    // **** 使用中チェック（マスタ編集用）

    /*
     * categoryIdから該当するレコード件数を取得する（有効なもの）。
     * @param categoryId
     * @return 
     */
    public int getSizeInCategoryId(long categoryId) {
        List<Key> result = query()
                .filter(nameOfCategoryId, Query.FilterOperator.EQUAL, categoryId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asKeyList();
        if (result == null) {
            return 0;
        }
        return result.size();
    }
    
    /*
     * userIdから該当するレコード件数を取得する（有効なもの）。
     * @param userId
     * @return 
     */
    public int getSizeInUserId(long userId) {
        // TODO: 設計次第　期限が切れたものは無効扱いすべきか
        List<Key> result = query()
                .filter(nameOfUserId, Query.FilterOperator.EQUAL, userId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asKeyList();
        if (result == null) {
            return 0;
        }
        return result.size();
    }
    

    // **** サンプルメソッド
    
    /*
     * カテゴリIDから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param categoryId
     * @return 
     */
    @Deprecated
    public List<Borrowing> getAllInCategory(long categoryId) {
        List<Borrowing> result = query()
                .filter(nameOfCategoryId, Query.FilterOperator.EQUAL, categoryId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<Borrowing>();
        }
        return result;
    }
    
    /*
     * 借用者IDから該当するレコードを取得する（有効なもの）。<br />
     * 使用は非推奨：　他の検索条件やページャ件数もあるのでこのqueryでは完結しない。
     * @param userId
     * @return 
     */
    @Deprecated
    public List<Borrowing> getAllInUserId(long userId) {
        List<Borrowing> result = query()
                .filter(nameOfUserId, Query.FilterOperator.EQUAL, userId)
                .filter(nameOfWasDeleted, Query.FilterOperator.EQUAL, false)
                .sort(nameOfCreated, SortDirection.DESCENDING)
                .asList();
        if (result == null) {
            return new ArrayList<Borrowing>();
        }
        return result;
    }
    
}
